#pragma once
#include <faiss/IndexFlat.h>
#include <faiss/Index.h>
#include <roaring/roaring.h>
#include <faiss/IndexIVFFlat.h>
#include <faiss/utils/utils.h>
#include <faiss/index_io.h> 
#include <fstream>
struct RoaringBitmapIdSelector:faiss::IDSelector{
    RoaringBitmapIdSelector(const roaring_bitmap_t* bitmap):bitmap(bitmap){}
    bool is_member(int64_t id)const final;
    ~RoaringBitmapIdSelector()override{}
    const roaring_bitmap_t* bitmap;
};

class FaissIndex{
public:
    //构造函数
    FaissIndex(faiss::Index *index);
    //插入函数，写入向量数据与标签
    void insert(const std::vector<float> &data,uint64_t label);
    //查找函数,寻找与data最相似的k个向量，返回数组和相应距离
    std::pair<std::vector<long>,std::vector<float>> searchVector(const std::vector
    <float> &data,int k,const roaring_bitmap_t* bitmap=nullptr);
    // 删除函数
    void remove_vectors(const std::vector<long> &ids);
    

    void saveIndex(const std::string& file_path); // 添加 saveIndex 方法声明
    void loadIndex(const std::string& file_path);
private:
    //存储FAISS指针
    faiss::Index *index;
};